/**
 * Paquete que contiene los objetos.
 */
package co.sumset.objetos;

/**
 * Clase Virus, la cual representa al atacante del juego,
 * que se limitar a moverse y a actuar en contra del jugador.
 * 
 * @author Cristian Raul Pineda Rodriguez
 */
public class Virus extends Actor{
	
	protected int vx;//Velocidad en el Eje X del Escenario
	protected int vy;//Velocidad en el Eje Y del Escenario
	private int cont_virus;//Contador de los virus.
	protected int aleatorio;// Determina que tipo de virus es creado.

	public Virus(Escenario stage) {
		super(stage);
		aleatorio=(int)(Math.random()*(3));
		if (aleatorio==0) {
			setSpriteNames( new String[] {"/juego/virusAmar01.png","/juego/virusAmar02.png","/juego/virusAmar03.png","/juego/virusAmar04.png","/juego/virusAmar05.png"});
			setFrameSpeed(35);
		}
		if (aleatorio==1) {
			setSpriteNames( new String[] {"/juego/virusAzul01.png","/juego/virusAzul02.png","/juego/virusAzul03.png","/juego/virusAzul04.png","/juego/virusAzul05.png"});
			setFrameSpeed(35);
		}
		if (aleatorio==2) {
			setSpriteNames( new String[] {"/juego/virusVerde01.png","/juego/virusVerde02.png","/juego/virusVerde03.png","/juego/virusVerde04.png","/juego/virusVerde05.png"});
			setFrameSpeed(35);
		}
		
	}

	/**
	 * Este Metodo establece el comportamiento del Virus rebotando cada vez que llega al limite del Escenario.
	 * Tambien establece la frecuencia del disparo para el Laser.
	 */
	public void act()
	{
		super.act();
		$varX+=vx;
		$varY+=vy;
		if ($varX < 0 || $varX > Escenario.WIDTH-32){
			vx = -vx;
		}

		if($varY < 0 || $varY > Escenario.HEIGHT-270){
			vy = -vy;
		}

		if (Math.random()<stage.getAdministrador().getNivel().getFrecuencia_fuego()){
			fire();
		}
	}

	/**
	 * Este metodo permite verificar las collisiones con otros Actores en el 
	 * caso del Virus si los Actores son: Bala o Bomba, Invocacion y Rojo; si estos colisionan con el 
	 * Virus este es removido del escenario y segun esa la colision se adquiere puntajes o reproduccion del virus.
	 * 
	 * @param a ; Recibe los actores que colisionan en el Escenario con el Vigilante.
	 */
	public void collision(Actor a) {
		if (a instanceof Bala || a instanceof Bomba){
			remove();
			stage.getSoundCache().playSound("explosion.wav");
			stage.getAgente().addScore(20);
			
		}

		if (a instanceof Invocacion ){
			remove();
			stage.getSoundCache().playSound("explosion.wav");
			stage.getAgente().addScore(30);
		}
		
		if (a instanceof Rojo){
			a.remove();
			
			int aletorio=(int)Math.random()*4;
			if (aletorio==0) {
				spawn(1);
			}else {
				spawn(aletorio);
			}
		}
	}

	/**
	 * Permite engendrar o reproducir nuevos objetos virus.
	 * 
	 * @param limite
	 */
	public void spawn(int limite) {

		for (int i = 0; i < limite; i++) {

			Virus m = new Virus(stage);
			int auxX=(int)(Math.random()*(stage.WIDTH-32));
			int auxY=(int)(Math.random()*(stage.HEIGHT-270));

			if(auxX==0 && auxY==0){
				m.set$varX(20);
				m.set$varY(20);
			}else {
				m.set$varX(auxX);
				m.set$varY(auxY);
			}

			m.setVx(1);
			m.setVy(1);
			stage.addActor(m);
		}
	}

	/**
	 * Metodo que implementa el comportamiento de disparo del Virus.
	 * 
	 */
	public void fire() {
		Laser m = new Laser(stage);
		m.set$varX($varX+getWidth()/2);
		m.set$varY($varY + getHeight());
		stage.addActor(m);
		stage.getSoundCache().playSound("photon.wav");
	}
	
	/**
	 * @return the vx
	 */
	public int getVx() {
		return vx;
	}

	/**
	 * @param vx the vx to set
	 */
	public void setVx(int vx) {
		this.vx = vx;
	}

	/**
	 * @return the vy
	 */
	public int getVy() {
		return vy;
	}

	/**
	 * @param vy the vy to set
	 */
	public void setVy(int vy) {
		this.vy = vy;
	}

	/**
	 * @return the cont_virus
	 */
	public int getCont_virus() {
		return cont_virus;
	}

	/**
	 * @param cont_virus the cont_virus to set
	 */
	public void setCont_virus(int cont_virus) {
		this.cont_virus = cont_virus;
	}

	public void subCont_virus(int i) { 
		cont_virus -= i;  
	}
}
